/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * GUILounge.java
 *
 * Created on 16-mei-2009, 16:59:43
 */

package gui;

import Toepen.LoungeFacade.FacadeGebruiker;
import Toepen.LoungeFacade.ILoungeFacade;
import Toepen.LoungeFacade.LoungeFacadeFactory;
import Toepen.LoungeFacade.LoungeObservable;
import Toepen.LoungeFacade.LoungeSpel;
import Toepen.LoungeFacade.Gebruiker;
import Toepen.SpelFacade.ISpelFacade;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import org.jdesktop.application.Action;
import org.jdesktop.application.SingleFrameApplication;

/**
 * Dit is de interface die alle acties die rondom de lounge liggen faciliteert
 * - Inloggen
 * - Registreren
 * - Spel starten
 * - Meedoen aan een spel
 *
 * Ook kun je zien welke spellen er aangemaakt zijn, en wie er allemaal ingelogd
 * zijn.
 * @author LucasD
 */
public class GUILounge extends javax.swing.JPanel {

    private ILoungeFacade loungeFacade;
    private FacadeGebruiker gebruiker;
    private LoungeObserver observer;
    private ListSelectionListener selectionListener;
    private SingleFrameApplication app;
    private LoungeSpel mijnSpel;
    private LoungeSpel meedoenSpel;
    private GUIView gameView;

    /**
     * Creates new form GUILounge
     * @param app
     */
    public GUILounge(SingleFrameApplication app) {
        this.app = app;

        initComponents();
        
        listSpellen.addListSelectionListener(selectionListener);
        listSpellen.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listSpellen.setLayoutOrientation(JList.VERTICAL);
        listGebruikers.addListSelectionListener(selectionListener);
        listGebruikers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listGebruikers.setLayoutOrientation(JList.VERTICAL);
        setButtons();

    }

    /**
     * Stelt in met welke LoungeFacade deze GUI communniceert
     * @param loungeFacade de LoungeFacade waarmee deze GUI communiceert
     * @return true als er niets fout is gegaan hierbij
     */
    public boolean setLounge(ILoungeFacade loungeFacade) {
        this.loungeFacade = loungeFacade;

        return true;
    }

    /**
     * Start de GUI van een spel op met de meegegeven SpelFacade
     * @param spelFacade de SpelFacade waarmee de spelGUI gaat communiceren
     */
    public void startSpel(ISpelFacade spelFacade)
    {
        gameView =new GUIView(this);
        gameView.setView(spelFacade, gebruiker);
        this.app.show(gameView);
    }

    /**
     * Deze functie wordt aangeroepen als het spel afgelopen is.
     * @param quitter als de persoon die het spel beeindigd heeft de speler zelf
     * is dan is deze true
     */
    void eindeSpel(boolean quitter) {
        if (!quitter) {
            SpelAfgebrokenDialog dialog = new SpelAfgebrokenDialog(app.getMainFrame(), true);
            dialog.setVisible(true);
            setButtonsAangemeld();
        }
        this.app.hide(gameView);
    }

    /**
     * Iedere ingelogde gebruiker kan een eigen spel aanmaken, waarna het ook
     * niet meer mogelijk is nog een spel te maken. Deze functie zet het spel
     * vast wat de gebruiker aangemaakt heeft
     * @param spel LoungeSpel wat de gebruiker aangemaakt heeft
     */
   public void setEigenSpel(LoungeSpel spel) {
        mijnSpel = spel;
    }

   /**
    * Een speler kan aan ieder spel meedoen wat zich in de lounge bevindt. Nadat
    * een speler zich aangemeld heeft om aan een spel mee te doen kan deze niet
    * aan nog een nieuw spel meedoen
    * @param spel LoungeSpel waaraan de speler mee wil doen
    */
   public void setMeedoenSpel(LoungeSpel spel) {
        meedoenSpel = spel;
    }

   /**
    * Nadat er via de LogonDialog ingelogd is op de LoungeFacade wordt de
    * FacadeGebruiker die daar het resultaat van is doorgegeven aan de GUILounge
    * en daarna kan de gebruiker meedoen aan spellen en een spel starten maar
    * niet nog een keer inloggen of registreren.
    * @param login FacadeGebruiker na het inloggen
    */
    void setIngelogdeGebruiker(FacadeGebruiker login) {
        this.gebruiker = login;

        try
        {
            observer = new LoungeObserver(this);
            loungeFacade.addObserver(observer, gebruiker);
            setButtonsAangemeld();
        }
        catch (Exception e)
        {
	        JOptionPane.showMessageDialog(this, e.getMessage(), "Er is iets misgegaan bij het inloggen", JOptionPane.INFORMATION_MESSAGE);
        }
        
       // setButtons();
    }

    /**
     * @return De ingelogde gebruiker
     */
    FacadeGebruiker getIngelogdeGebruiker() {
        return this.gebruiker;
    }

    /**
     * Functie die aangeroepen wordt vanuit de facade waardoor alle laatste
     * gegevens geupdate worden vanuit het domeinmodel
     * @param observable LoungeObservable met de laatste gegevens
     */
    void update(LoungeObservable observable) {
        //setButtons();
        

        update(observable.getSpellen().iterator(), observable.getGebruikers().iterator());
    }

    private void setButtons() {
        btnAanmelden.setEnabled(true);
        btnNieuwSpel.setEnabled(true);
        btnRegistreren.setEnabled(true);

        btnAfmelden.setEnabled(false);
        btnMeedoen.setEnabled(false);
        btnNieuwSpel.setEnabled(false);

        /*
        btnAanmelden.setEnabled(gebruiker == null);
        btnNieuwSpel.setEnabled(gebruiker != null && mijnSpel == null);
        btnRegistreren.setEnabled(gebruiker == null);*/
    }

     private void setButtonsAangemeld() {
        btnAanmelden.setEnabled(false);
        //btnNieuwSpel.setEnabled(true);
        btnRegistreren.setEnabled(false);
        btnAfmelden.setEnabled(true);
       // btnMeedoen.setEnabled(true);
     }

    private void update(Iterator<LoungeSpel> loungeSpellen, Iterator<FacadeGebruiker> loungeGebruikers) {
        DefaultListModel newSpellenList = new DefaultListModel();
        DefaultListModel newGebruikerList = new DefaultListModel();
        boolean spelstarter=false;
        boolean meedoenSpelBestaatNog=false;

        while (loungeSpellen.hasNext()) {
            LoungeSpel nextSpel = loungeSpellen.next();
            newSpellenList.addElement(nextSpel);

            if (nextSpel.getSpelStarter().getNaam().equals(gebruiker.getNaam()))
            {
                spelstarter=true;
                setEigenSpel(nextSpel);
            }
            if (meedoenSpel != null )
            {
                if (meedoenSpel.getId() == nextSpel.getId()){
                meedoenSpelBestaatNog=true;
                }
            }
        }
        if (!meedoenSpelBestaatNog){
            setMeedoenSpel(null);
        }
        btnNieuwSpel.setEnabled(!spelstarter);
        btnStart.setEnabled(spelstarter);
        btnMeedoen.setEnabled(!spelstarter && meedoenSpel == null);

        listSpellen.setModel(newSpellenList);

        while (loungeGebruikers.hasNext()) {
           FacadeGebruiker nextGebruiker = loungeGebruikers.next();
            newGebruikerList.addElement(nextGebruiker.getNaam());

        }
        listGebruikers.setModel(newGebruikerList);
        if (listGebruikers.getLastVisibleIndex()!=-1){
            setButtonsAangemeld();
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                                                   
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        listSpellen = new javax.swing.JList();
        btnAanmelden = new javax.swing.JButton();
        btnNieuwSpel = new javax.swing.JButton();
        btnRegistreren = new javax.swing.JButton();
        btnMeedoen = new javax.swing.JButton();
        btnStart = new javax.swing.JButton();
        btnAfmelden = new javax.swing.JButton();
        lblSpellenlijst = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        listGebruikers = new javax.swing.JList();
        lblGebruikerslijst = new javax.swing.JLabel();


        setName("Form"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        listSpellen.setName("listSpellen"); // NOI18N
        listSpellen.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                listSpellenValueChanged(evt);
            }
        });
    
        jScrollPane1.setViewportView(listSpellen);

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(gui.GUIApp.class).getContext().getActionMap(GUILounge.class, this);
        btnAanmelden.setAction(actionMap.get("showLogin")); // NOI18N
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(gui.GUIApp.class).getContext().getResourceMap(GUILounge.class);
        btnAanmelden.setText(resourceMap.getString("btnAanmelden.text")); // NOI18N
        btnAanmelden.setToolTipText(resourceMap.getString("btnAanmelden.toolTipText")); // NOI18N
        btnAanmelden.setName("btnAanmelden"); // NOI18N

        btnNieuwSpel.setAction(actionMap.get("showNieuwSpel")); // NOI18N
        btnNieuwSpel.setText(resourceMap.getString("btnNieuwSpel.text")); // NOI18N
        btnNieuwSpel.setToolTipText(resourceMap.getString("btnNieuwSpel.toolTipText")); // NOI18N
        btnNieuwSpel.setName("btnNieuwSpel"); // NOI18N

        btnRegistreren.setAction(actionMap.get("showRegistratie")); // NOI18N
        btnRegistreren.setText(resourceMap.getString("btnRegistreren.text")); // NOI18N
        btnRegistreren.setToolTipText(resourceMap.getString("btnRegistreren.toolTipText")); // NOI18N
        btnRegistreren.setName("btnRegistreren"); // NOI18N

        btnMeedoen.setText(resourceMap.getString("btnMeedoen.text")); // NOI18N
        btnMeedoen.setEnabled(false);
        btnMeedoen.setName("btnMeedoen"); // NOI18N
        btnMeedoen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnMeedoenActionPerformed(evt);
            }
        });

        btnStart.setText(resourceMap.getString("btnStart.text")); // NOI18N
        btnStart.setEnabled(false);
        btnStart.setName("btnStart"); // NOI18N
        btnStart.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnStartActionPerformed(evt);
            }
        });

        btnAfmelden.setAction(actionMap.get("removeIngelogdeGebruiker")); // NOI18N
        btnAfmelden.setText(resourceMap.getString("btnAfmelden.text")); // NOI18N
        btnAfmelden.setToolTipText(resourceMap.getString("btnAfmelden.toolTipText")); // NOI18N
        btnAfmelden.setMaximumSize(new java.awt.Dimension(89, 23));
        btnAfmelden.setMinimumSize(new java.awt.Dimension(89, 23));
        btnAfmelden.setName("btnAfmelden"); // NOI18N
        btnAfmelden.setPreferredSize(new java.awt.Dimension(89, 23));

        lblSpellenlijst.setLabelFor(listSpellen);
        lblSpellenlijst.setName("lblSpellenlijst"); // NOI18N

        jScrollPane2.setName("jScrollPane2"); // NOI18N

        listGebruikers.setName("listGebruikers"); // NOI18N
        jScrollPane2.setViewportView(listGebruikers);

        lblGebruikerslijst.setLabelFor(listGebruikers);
        lblGebruikerslijst.setName("lblGebruikerslijst"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(btnAanmelden, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnNieuwSpel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnRegistreren, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnAfmelden, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 201, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(btnMeedoen)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnStart)))
                    .addComponent(lblSpellenlijst, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblGebruikerslijst, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(111, 111, 111))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnAanmelden)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnNieuwSpel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnRegistreren)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnAfmelden, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lblSpellenlijst)
                            .addComponent(lblGebruikerslijst))
                        .addGap(1, 1, 1)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jScrollPane2)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 227, Short.MAX_VALUE))))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnMeedoen)
                    .addComponent(btnStart))
                .addContainerGap(18, Short.MAX_VALUE))
        );
    }// </editor-fold>                        

    private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        try
        {
            loungeFacade.startSpel((LoungeSpel) listSpellen.getSelectedValue());
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            //JOptionPane.showMessageDialog(this, ex.getMessage(), "Er gaat iets fout...", JOptionPane.INFORMATION_MESSAGE);
        }
    }                                        

    private void listSpellenValueChanged(javax.swing.event.ListSelectionEvent evt) {                                         
        // enable/disable startspel buttons
        if (listSpellen.getLastVisibleIndex()>0 && listSpellen.getSelectedValues().length <= 0){
                listSpellen.setSelectedIndex(listSpellen.getFirstVisibleIndex());
            }

        if (listSpellen.getSelectedValues().length > 0) {
            LoungeSpel spel = (LoungeSpel)listSpellen.getSelectedValue();
            btnStart.setEnabled(spel == mijnSpel);
            if (meedoenSpel == null){
            btnMeedoen.setEnabled(spel != mijnSpel);}
            else btnMeedoen.setEnabled(false);
            btnNieuwSpel.setEnabled(mijnSpel == null);
        }
        else {         
            btnStart.setEnabled(false);
            btnMeedoen.setEnabled(false);
            btnNieuwSpel.setEnabled(mijnSpel == null);
        }
    }                                        


    private void btnMeedoenActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        try
        {
            setMeedoenSpel((LoungeSpel)listSpellen.getSelectedValue());
            loungeFacade.joinSpel((LoungeSpel)listSpellen.getSelectedValue(), gebruiker);


         //    setButtonsAangemeld();
         //   btnNieuwSpel.setEnabled(false);

       }
        catch(Exception ex)
        {
            JOptionPane.showMessageDialog(this, ex.getMessage(), "FOUT", JOptionPane.INFORMATION_MESSAGE);
        }
    }                                          

    @Action
    private void showLogin() throws Exception {
        try {
            LogonDialog logon = new LogonDialog(app.getMainFrame(), true, "Vul gebruikersnaam en wachtwoord in om in te loggen", loungeFacade, this);
            logon.setVisible(true);
        } catch (Exception ex) {
            Logger.getLogger(GUILounge.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Action
    private void showRegistratie() throws Exception {
        try {
            RegistratieDialog registratie = new RegistratieDialog(app.getMainFrame(), true, loungeFacade, this);
            registratie.setVisible(true);
        } catch (Exception ex) {
            Logger.getLogger(GUILounge.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Action
    private void showNieuwSpel() {
        NieuwSpelDialog nieuwSpel = new NieuwSpelDialog(app.getMainFrame(), true, loungeFacade, this);
        nieuwSpel.setVisible(true);

    }

    @Action
    private void removeIngelogdeGebruiker() {
        try
        {
            loungeFacade.removeObserver(this.gebruiker);
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(this, e.getMessage(), "FOUT", JOptionPane.INFORMATION_MESSAGE);
        }

        this.gebruiker = null;
        this.observer = null;
        setMeedoenSpel(null);

        btnAfmelden.setEnabled(false);
        btnNieuwSpel.setEnabled(false);
        btnMeedoen.setEnabled(false);
        btnStart.setEnabled(false);
        btnAanmelden.setEnabled(true);
        btnRegistreren.setEnabled(true);

        listSpellen.setModel(new DefaultListModel());
        listGebruikers.setModel(new DefaultListModel());
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables

    public SingleFrameApplication getApplication() {
        return app;
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnAanmelden;
    private javax.swing.JButton btnAfmelden;
    private javax.swing.JButton btnMeedoen;
    private javax.swing.JButton btnNieuwSpel;
    private javax.swing.JButton btnRegistreren;
    private javax.swing.JButton btnStart;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JLabel lblGebruikerslijst;
    private javax.swing.JLabel lblSpellenlijst;
    private javax.swing.JList listGebruikers;
    private javax.swing.JList listSpellen;
    // End of variables declaration//GEN-END:variables
                 

}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
